package demo;

import java.util.Arrays;

/**
 * 1、获得顺序表的长度
 * 2、判断顺序表是否已满
 *    判断顺序表是否为空
 * 3、打印顺序表
 * 4、在顺序表后新增元素
 *   给pos位置新增元素
 * 5、判断是否包含某个元素
 *   查找某个元素对应的位置
 *   删除第一次出现的元素 key
 * 6、获得pos位置的元素
 *   给pos位置的元素更新为value
 * 7、清空顺序表
 */
public class MyArrayList {
    private int[] elem;//数组
    private int usedSize;//顺序表的有效元素
    private static final int DEFAULT_VALUE = 10;

    public MyArrayList() {
        this.elem = new int[DEFAULT_VALUE];
    }
    //获得顺序表的长度
    public int size(){
        return this.usedSize;
    }
    //判断顺序表是否已满
    public boolean isFull(){
        if(this.size() >= this.elem.length){
            return true;
        }
        return false;
    }
    //判断顺序表是否为空
    public boolean isEmpty(){
        if(this.size() == 0){
            return true;
        }
        return false;
    }
    //打印顺序表
    public void display(){
        for (int i = 0; i < this.size(); i++) {
            System.out.print(this.elem[i] + " ");
        }
        System.out.println();
    }
    //在顺序表后新增元素
    public void add(int data){
        if(isFull()){
            this.elem = Arrays.copyOf(this.elem,this.elem.length*2);
        }
        this.elem[this.usedSize] = data;//
        usedSize++;
    }
    //给pos位置新增元素
    public void add(int pos,int data) throws PosWrongfulException{
        if(isFull()){
            this.elem = Arrays.copyOf(this.elem,this.elem.length*2);
        }
        if((pos < 0) ||( pos > this.size())){
            throw new PosWrongfulException("pos不合法异常！");
        }
        for (int i = this.usedSize-1; i >= pos; i--) {
            this.elem[i+1] = this.elem[i];
        }
        this.elem[pos] = data;
        this.usedSize++;
    }
    //判断是否包含某个元素
    public boolean contains(int toFind){
        for (int i = 0; i < this.size(); i++) {
            if(this.elem[i] == toFind){
                return true;
            }
        }
        return false;
    }
    //查找某个元素对应的位置
    public int indexOf(int toFind){
        for (int i = 0; i < this.size(); i++) {
            if(this.elem[i] == toFind){
                return i;
            }
        }
        return -1;
    }
    //删除第一次出现的元素 key
    public void remove(int key){
        //空的顺序表没有key可加可不加
        if(isEmpty()){
            System.out.println("顺序表为空！");
            throw new EmptyException("顺序表为空异常");
        }
        int ret = indexOf(key);
        if(ret == -1){
            System.out.println("没有这个元素！");
            return;
        }
        for (int i = ret; i < this.size() -1; i++) {
            this.elem[i] = this.elem[i+1];
        }
        this.usedSize--;
    }
    //获得pos位置的元素
    public int get(int pos){
        if(isEmpty()){
            System.out.println("顺序表为空！");
            throw new EmptyException("顺序表为空异常");
        }
        if((pos < 0)||(pos >= this.size())){
            throw new PosWrongfulException("get顺序表元素时，pos不合法异常!");
        }
        return this.elem[pos];
    }
    // 给pos位置的元素更新为value
    public void set(int pos,int value){
        if(isEmpty()){
            System.out.println("顺序表为空！");
            throw new EmptyException("顺序表为空异常");
        }
        if((pos < 0)||(pos >= this.size())){
            throw new PosWrongfulException("set顺序表元素时，pos不合法异常!");
        }
        this.elem[pos] = this.elem[value];
    }
    // 清空顺序表
    public void clear(){
        this.usedSize = 0;
    }

}
